package GenericTest;

import java.util.ArrayList;
import java.util.List;

class Person {
}

class Student extends Person {
}

public class GenericTest {
    public static void main(String[] args) {
        List<? extends Person> listSubPerson = null;
        List<? super Person> listSupPerson = null;
        List<Student> listStudent = new ArrayList<Student>();
        List<Person> listPerson = new ArrayList<Person>();
        List<Object> listObject = new ArrayList<Object>();
        listSubPerson = listStudent;
        listSubPerson = listPerson;
        // listSubPerson = listObject; // Object不是Person的子类
        // listSupPerson = listStudent; // Student不是Person的父类
        listSupPerson = listPerson;
        listSupPerson = listObject;

        // 读取数据：
        listSubPerson = listStudent;
        Person p = listSubPerson.get(0);

        // 编译不通过，因为listSubPerson的类型是? extends Person，可能是Person的子类，但具体是哪个子类不确定
        // Student s = listSubPerson.get(0);
        listSupPerson = listPerson;
        Object obj = listSupPerson.get(0);

        // 编译不通过，因为listSupPerson的类型是? super Person，可能是Person的父类，但具体是哪个父类不确定
        // Person obj = listSupPerson.get(0);

        // 写入数据：
        // 编译不通过，因为listSubPerson的类型是? extends Person，可能是Person的子类，但具体是哪个子类不确定
        // listSubPerson.add(new Student());

        // 编译通过，因为listSupPerson的类型是? super Person，Person是Student的父类
        listSupPerson.add(new Person());
        listSupPerson.add(new Student());

        // 编译不通过，因为listSupPerson的类型是? super
        // Person，Object是Person的父类，加入后如果读取为Person类型会出错，Object不一定实现所有Person的方法
        // listSupPerson.add(new Object());

        // 即 List<Person> 只能容纳Person及其子类，其父类不一定实现了Person的所有方法
    }
}
